﻿<!DOCTYPE HTML>
<!-- saved from url=(0089)http://172.13.19.31:6060/note_html/Java/JUnit/1003010-断言、运行器、参数化、打包测试.html -->
<!DOCTYPE html PUBLIC "" ""><HTML><HEAD><META content="IE=11.0000" 
http-equiv="X-UA-Compatible">
 
<META http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<TITLE>断言、运行器、参数化、打包测试</TITLE> <LINK href="断言、运行器、参数化、打包测试_files/standalone.css" 
rel="stylesheet"> <LINK href="断言、运行器、参数化、打包测试_files/overlay-apple.css" rel="stylesheet"> 
<LINK href="断言、运行器、参数化、打包测试_files/article_edit.css" rel="stylesheet"> 
<STYLE type="text/css">
	#content{
		margin: 5px 10px;
	}
</STYLE>
	 <!-- 代码高亮 -->	 <LINK href="断言、运行器、参数化、打包测试_files/shCoreEclipse.css" rel="stylesheet">
	 <LINK href="断言、运行器、参数化、打包测试_files/my-highlighter.css" rel="stylesheet"> 
<META name="GENERATOR" content="MSHTML 11.00.10586.545"></HEAD> 
<BODY>
<DIV id="content">
<H1 align="center">断言、运行器、参数化、打包测试</H1>
<P align="right" 
style="margin: 0px 10px 0px 0px; padding: 0px;">最后修改时间：2016-01-09 16:58:10</P>
<HR style="border-width: 2px; border-color: lime;">

<H3>JUnit说明</H3>
<UL>
  <LI>若assert语句失败，则assert下面的代码将不会执行。</LI>
  <LI>如果双击方法名，再点右键——Run As——JUnit Test，则只测试这个方法。</LI></UL>
<H3>断言</H3>
<UL>
  <LI>assertEquals：多个重载方法，用来查看对象中存的值是否是期待的值，与字符串比较中使用的equals()方法类似。都是对象比较。注意：比较double和float浮点类型时使用assertEquals(0.2, 
  0.2,0.000001);//最后一位是double和float浮点型的误差范围，在此范围内视为相等。</LI>
  <LI>assertFalse和assertTrue：用来查看变量是是否为false或true，如果assertFalse()查看的变量的值是false则测试成功，如果是true则失败，assertTrue()与之相反;</LI>
  <LI>assertSame和assertNotSame：各2个重载，用来比较两个对象的引用是否相等和不相等，类似于通过“==”和“!=”比较两个对象；</LI>
  <LI>assertNull()和assertNotNull()：各2个重载，用来查看对象是否为空和不为空;</LI>
  <LI>fail 
  ()：2个重载，意为失败，用来抛出错误。一般有两个用途：首先是在测试驱动开发中，由于测试用例都是在被测试的类之前编写，而写成时又不清楚其正确与否，此时就可以使用fail方法抛出错误进行模拟；其次是抛出意外的错误，比如要测试的内容是从数据库中读取的数据是否正确，而导致错误的原因却是数据库连接失败。</LI></UL>
<H3>运行器 - Runner</H3>
<P style="text-indent: 0.8cm;">大家有没有想过这个问题，当你把测试代码提交 
给JUnit框架后，框架如何来运行你的代码呢？答案就是——Runner。在JUnit中有很多个Runner，他们负责调用你的测试代码，每一个 
Runner都有各自的特殊功能，你要根据需要选择不同的Runner来运行你的测试代码。我们用@RunWith来指定运行器。可能你会觉得奇怪，前面我们写了那么多测试，并没有明确指定一 
个Runner啊？这是因为JUnit中有一个默认Runner，如果你没有指定，那么系统自动使用默认Runner来运行你的代码。换句话说，下面两段 
代码含义是完全一样的： </P>
<PRE class="brush: java;">import org.junit.internal.runners.TestClassRunner;

import org.junit.runner.RunWith;

//使用了系统默认的TestClassRunner，与下面代码完全一样

public class CalculatorTest …{…} 

@RunWith(TestClassRunner.class)

public class CalculatorTest …{…}
</PRE>
<H3>参数化</H3>
<PRE class="brush: java;">import static org.junit.Assert.assertEquals;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.junit.runners.Parameterized;

import org.junit.runners.Parameterized.Parameters;

import java.util.Arrays;

import java.util.Collection;

 

@RunWith(Parameterized.class)
public class SquareTest …{

private static Calculator calculator = new Calculator();

private int param;

private int result;    

@Parameters   
public static Collection data() …{

        return Arrays.asList(new Object[][]…{

                …{2, 4},

                …{0, 0},

                …{－3, 9},

        });

}

//构造函数，对变量进行初始化
public SquareTest(int param, int result) …{

        this.param = param;
        this.result = result;

}

@Test   
public void square() …{

        calculator.square(param);

        assertEquals(result, calculator.getResult());

    }

 }
</PRE>
<H3>打包测试</H3>
<P style="text-indent: 0.8cm;">
在一个项目中，只写一个测试类是不可能的，我们会写出很多很多个测试类。可是这些测试类必须一个一个的执行，也是比较麻烦的事情。鉴于此，JUnit为我们提供了打 
包测试的功能，将所有需要运行的测试类集中起来，一次性的运行完毕，大大的方便了我们的测试工作。具体代码如下： </P>
<PRE class="brush: java;">import org.junit.runner.RunWith;

import org.junit.runners.Suite;

@RunWith(Suite.class)

@Suite.SuiteClasses(…{CalculatorTest.class, SquareTest.class})

public class AllCalculatorTests …{}
</PRE>
<P style="text-indent: 0.8cm;">这个功能也需要使用一个特殊的 
Runner，因此我们需要向@RunWith标注传递一个参数Suite.class。同时，我们还需要另外一个标注 
@Suite.SuiteClasses，来表明这个类是一个打包测试类。我们把需要打包的类作为参数传递给该标注就可以了。有了这两个标注之后，就已经 
完整的表达了所有的含义，因此下面的类已经无关紧要，随便起一个类名，内容全部为空既可。 </P>
<H3>Spring整合测试</H3>
<H4>加入依赖包</H4>
<UL>
  <LI>JUnit 4：junit-4.12.jar</LI>
  <LI>Spring Test：spring-test-3.2.16.RELEASE.jar</LI>
  <LI>Spring依赖的其他包</LI></UL>
<H4>示例</H4>
<PRE class="brush: java;">import java.util.HashMap;
import java.util.Map;

import static org.junit.Assert.*;//静态导入断言
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.forlink.fkcore.exception.AppException;
import com.forlink.formbm.inter.supplychain.SupplyChainService;

@RunWith(SpringJUnit4ClassRunner.class)//使用Spring Test的运行器
@ContextConfiguration(locations={"classpath*:spring-dao-test.xml"})//多个xml文件用逗号隔开，关于spring的配置，这里不做叙述
public class SupplyChainTest {
	
	@Autowired
	SupplyChainService supplyChainService;//要测试的接口
	
	
	@Test(timeout=5000)//最好都加上timeout，防止死循环(测试时间)
	public void testAddSupplyChain(){//测试方法必须为void且不能有参数
		
		Map&lt;string,object&gt; whereMap = new HashMap&lt;string,object&gt;();
		try {
			System.out.println(supplyChainService.query_mbm_supply_chain(whereMap));
		} catch (AppException e) {
			e.printStackTrace();
		}
	}
	
}
</PRE>
<H3>单个测试类中的测试方法顺序执行</H3>
<PRE class="brush: java;">@RunWith(SpringJUnit4ClassRunner.class)//使用Spring Test的运行器
@ContextConfiguration(locations={"classpath*:spring-dao-test.xml"})//多个xml文件用逗号隔开
@FixMethodOrder(MethodSorters.NAME_ASCENDING)//按照方法名的ascending编码先后执行测试
public class TestSupplyChainService {
	
	@Autowired
	SupplyChainService supplyChainService;//要测试的接口
	
	@Test(timeout=5000)//最好都加上timeout，防止死循环(测试时间)
	public void test_1_add_mbm_supply_chain(){//测试方法必须为void且不能有参数
		
		Map&lt;string,object&gt; whereMap = new HashMap&lt;string,object&gt;();
		try {
			System.out.println(supplyChainService.query_mbm_supply_chain(whereMap));
		} catch (AppException e) {
			e.printStackTrace();
		}
	}
	
	
	@Test(timeout=5000)//最好都加上timeout，防止死循环(测试时间)
	public void test_2_add_mbm_supply_chain(){//测试方法必须为void且不能有参数
		
		System.out.println("首先执行");
	}
	
}
</PRE>
<HR style="border-width: 2px; border-color: lime;">

<DIV align="center">©copyright 版权所有   作者：zzy</DIV>
<SCRIPT src="../../pub/syntaxhighlighter/scripts/shCore.js" type="text/javascript"></SCRIPT>
 
<SCRIPT src="../../pub/syntaxhighlighter/scripts/shBrushJava.js" type="text/javascript"></SCRIPT>
	
<SCRIPT src="../../pub/syntaxhighlighter/scripts/shBrushJScript.js" type="text/javascript"></SCRIPT>
 
<SCRIPT src="../../pub/syntaxhighlighter/scripts/shBrushXml.js" type="text/javascript"></SCRIPT>
 
<SCRIPT src="../../pub/syntaxhighlighter/scripts/shBrushSql.js" type="text/javascript"></SCRIPT>
 
<SCRIPT src="../../pub/syntaxhighlighter/scripts/shBrushBash.js" type="text/javascript"></SCRIPT>
	
<SCRIPT src="../../pub/syntaxhighlighter/scripts/shBrushVb.js" type="text/javascript"></SCRIPT>
	
<SCRIPT src="../../pub/syntaxhighlighter/init.js" type="text/javascript"></SCRIPT>
 
<SCRIPT src="../../pub/js/jquery.tools.min.js" type="text/javascript"></SCRIPT>
 <!-- make all links with the 'rel' attribute open overlays --> 
<SCRIPT>
  $(function() {
      $("#apple img[rel]").overlay({effect: 'apple'});
    });
</SCRIPT>
 </DIV></BODY></HTML>
